package com.sright.bcard.common.service.share.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.concurrent.TimeUnit;

@Component
public class JedisUtil {

    @Autowired
    private JedisPool jedisPool;

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 存储键值对
     * @param key
     * @param value
     * @return
     */
    public String set(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        try {
            String set = jedis.set(key, value);
            return set;
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 存储字符串键值对
     * @param key
     * @param value
     * @return
     * @date 2018年12月14日
     */
    public String setExpire(String key, String value, Integer seconds) {
        Jedis jedis = jedisPool.getResource();
        try {
            String set = jedis.set(key, value);
            jedis.expire(key, seconds);
            return set;
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 得到对应键的字符串值
     * @param key
     * @return
     * @date 2018年12月14日
     */
    public String get(String key) {
        Jedis jedis = jedisPool.getResource();
        try {
            return jedis.get(key);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 删除字符串键值对
     * @param key
     * @return
     * @date 2018年12月14日
     */
    public Long del(String key) {
        Jedis jedis = jedisPool.getResource();
        try {
            return jedis.del(key);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 存储对象
     * @param key
     * @param value
     * @return
     * @date 2018年12月14日
     */
    public String setObject(String key, Object value, Integer seconds) {
        Jedis jedis = jedisPool.getResource();
        try {
            String set = jedis.set(key.getBytes(), ObjectUtil.serialize(value));
            jedis.expire(key, seconds);
            return set;
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 得到对应键的对象
     * @param key
     * @return
     * @date 2018年12月14日
     */
    public Object getObject(String key) {
        Jedis jedis = jedisPool.getResource();
        try {
            byte[] byteArr =  jedis.get(key.getBytes());
            return ObjectUtil.unSerialize(byteArr);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     * 获得锁
     * @param lockKey
     * @param millisecond
     * @return
     */
    public Boolean getLock(String lockKey, Long millisecond) {
        Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, "lock",
                millisecond, TimeUnit.MILLISECONDS);
        return success != null && success;
    }

    /**
     * 释放锁
     * @param lockKey
     */
    public void releaseLock(String lockKey) {
        redisTemplate.delete(lockKey);
    }

}
